#include "commonpage.h"
#include "ui_commonpage.h"

#include <QDebug>

CommonPage::CommonPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CommonPage)
{
    ui->setupUi(this);

    ui->pageMusicList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 禁用水平滚动条

    connect(ui->playAllBtn, &QPushButton::clicked, this, [=](){
        //播放所有按钮点击以后，通知QQmusic播放当前pageType标记的page页面中的歌曲
        emit PlayAll(pageType);
    });


    //鼠标双击item后，发射信号后告诉QQmusic播放那首音乐
    connect(ui->pageMusicList, &QListWidget::doubleClicked, this, [=](const QModelIndex& index){
        emit playMusicByIndex(this, index.row()); //双击以后触发对应的item的行号
    });
}


CommonPage::~CommonPage()
{
    delete ui;
}


void CommonPage::setCommonPageUI(const QString &text, const QString &imagePath)
{
    ui->PageTittle->setText(text);

    ui->musicImageLabel->setPixmap(QPixmap(imagePath));
    ui->musicImageLabel->setScaledContents(true);  //让图片去适应QLable的大小  根据标签的大小进行缩放

}

void CommonPage::setMusicListType(PageType pageType)
{
    this->pageType = pageType;
}


void CommonPage::addMusicToMusicPage(MusicList &musicList)
{
    //1,清除掉之前的歌曲内容
    //清除musicOfPage
    musicOfPage.clear(); //防止重复
    for(auto music: musicList)
    {
        switch(pageType)
        {
            case LIKE_Page:
                if(music.getIsLike())
                {
                    musicOfPage.push_back(music.getMusicId());
                }
                break;
            case LOCAL_Page:
                musicOfPage.push_back(music.getMusicId());
                break;
            case HISTORY_Page:
                if(music.getIsHistory())
                {
                    musicOfPage.push_back(music.getMusicId());
                }
                break;
            default:
               qDebug() <<"暂未支持";
        }
    }
}


void CommonPage::reFresh(MusicList &musicList)
{
    ui->pageMusicList->clear(); //将QListWidget之前添加的内容也全部清空

    //添加新的歌曲
    addMusicToMusicPage(musicList);  //把所有的音乐musicList对应添加到musicOfPage里面

    for(auto e : musicOfPage)
    {
        auto it = musicList.findMusicByMusicId(e);
        if(it == musicList.end())
        {
            continue;
        }

        //将Music的歌曲名称，作者，专辑名称更新到界面
        //测试代码
        //将ListBoxItem对象放到pageMusicList中,构造一个ListBoxItem对象
        ListItemBox* listItemBox = new ListItemBox(this);
        listItemBox->setMusicName(it->getMusicName());
        listItemBox->setMusicSinger(it->getMusicSinger());
        listItemBox->setMusicAlbum(it->getMusicAlbum());
        listItemBox->setLikeMusic(it->getIsLike());
//        qDebug() << it->getMusicName();
//        qDebug() << it->getMusicSinger();
//        qDebug() << it->getMusicName();

        QListWidgetItem* item = new QListWidgetItem(ui->pageMusicList); //指定item的父元素为ui->pageMusicList
        //qDebug() <<  item->sizeHint();
        item->setSizeHint(QSize(listItemBox->width(), listItemBox->height()));
        ui->pageMusicList->setItemWidget(item, listItemBox); //  void setItemWidget(QListWidgetItem *item, QWidget *widget);

        connect(listItemBox, &ListItemBox::setIsLike, this, [=](bool IsLike){
            //更新歌曲的状态
            //需要通知QQMusic，让其中的likePage, localPage,recentPage去更新页面的歌曲信息
            it->setIsLike(IsLike);
            emit updateLikeMusic(IsLike, it->getMusicId());
        });
    }

    //触发窗口重绘paintEvent;
    //update();  //将paintEvent事件放在事件循环队列中，然后返回，没有立刻处理
    repaint();  //立刻响应paintEvent()事件
}



//musicList存放的是所有的音乐, 这个方法需要在哪里调用呢？ 也不能initPlay()内部调用
//因为刚开始没有addLocal的时候，musicList都是空的，当要播放音乐的时候可以调用，也就是刷新对应playList
//当程序启动的时候，默认是localPage，也可以进行添加。特别是当
void CommonPage::addMusicToPlaylist(MusicList &musicList, QMediaPlaylist *playList)
{
    for(auto music : musicList) //musicList自己内部实现了迭代器，所以可以对这个类
    {
        //
        switch(pageType)
        {
             case LIKE_Page:
                if(music.getIsLike())
                {
                    playList->addMedia(music.getMusicQurl());
                }
                break;
             case LOCAL_Page:
                playList->addMedia(music.getMusicQurl());
                break;
             case HISTORY_Page:
                if(music.getIsHistory())
                {
                    playList->addMedia(music.getMusicQurl());
                }
                 break;
             default:
             qDebug() << "未支持的音乐";
        }
    }
}

QString CommonPage::getMusicIdByIndex(int index)
{
    if(index >= musicOfPage.size())
    {
        qDebug() << "无歌曲";
        return "";
    }

    return musicOfPage[index];
}

void CommonPage::setMusicImage(QPixmap pixmap)
{
    ui->musicImageLabel->setPixmap(pixmap);
    ui->musicImageLabel->setScaledContents(true);


}


//界面中播放所有按钮添加的槽函数应该CommonPage中,但是CommonPage并不具备歌曲播放能力，歌曲播放的是QQMusic负责的
//所以点击发送PlayAll的信号，给QQmusic，然后里面有PageType可以告诉是哪个local_page, like_page, historyPage




//最近播放，将播放过的歌曲加载到recentPage页面的播放列表中
//什么时候添加？当歌曲播放的时候添加
//如何知道歌曲有没有播放呢，播放的是那首歌曲，那个页面的歌曲
//如果知道播放哪个页面的那首歌曲，直接将该歌曲的isHistory属性设置为true
//然后让recentPage->reFresh即可

//触发当前页面歌曲播放操作:
//点击播放所有按钮，双击CommonPage中的QListWidget的列表项；点击播放按钮
//只要能知道播放歌曲所在列表中的索引，就能通过CommonPage知道播放哪首歌曲，因为CommonPage
//中记录了当前页面的所有歌曲，而且歌曲的索引次序和playList中歌曲的所有是一致的
//QMediaPlayList中有一个信号 void QMediaPlaylist::currentIndexChanged(int position)
//这个position的参数:正在播放的歌曲的在播放列表playList中的索引









